<?php

	define("T_DOMINGO",0);
	define("T_LUNES",1);
	define("T_MARTES",2);
	define("T_MIERCOLES",3);
	define("T_JUEVES",4);
	define("T_VIERNES",5);
	define("T_SABADO",6);
	
	define("T_ENERO",1);
	define("T_FEBRERO",2);
	define("T_MARZO",3);
	define("T_ABRIL",4);
	define("T_MAYO",5);
	define("T_JUNIO",6);
	define("T_JULIO",7);
	define("T_AGOSTO",8);
	define("T_SEPTIEMBRE",9);
	define("T_OCTUBRE",10);
	define("T_NOVIEMBRE",11);
	define("T_DICIEMBRE",12);
	
	define("T_PRIMER",1);
	define("T_SEGUNDO",2);
	define("T_TERCER",3);
	define("T_CUARTO",4);
	define("T_ULTIMO",32);
	
	class FechaVenezuela { // formato dia mes ano
		var $_mifecha;
		var $_misdias;
		var $_mismeses;
		var $_festivos;
		var $_festivoscalculados;
		

	    function FechaVenezuela($fecha = '') {		
			if(is_numeric($fecha) && intval($fecha>1900)) $fecha = "01-01-".$fecha;
			if($fecha=='') $fecha = date("d-m-Y");	
			$this->_mifecha=$fecha;
			list($dia,$mes,$ano) = explode("-",$fecha);
			$this->_misdias = array("domingo","lunes","martes","miercoles","jueves","viernes","sabado");
			$this->_mismeses = array("enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre");
			$this->_festivos = "1.1,19.4,1.5,24.6,5.7,12.10,25.12,31.12"; // feriados fijos en formato dia.mes separados por coma
			$this->_festivoscalculados = array();
			$ndias = easter_days($ano);			
			$this->_festivoscalculados[] = date('d-m-Y',mktime(1,1,1,3,$ndias + 18,$ano)); // jueves santo				
			$this->_festivoscalculados[] = date('d-m-Y',mktime(1,1,1,3,$ndias + 19,$ano)); // viernes santo		
			$this->_festivoscalculados[] = date('d-m-Y',mktime(1,1,1,3,$ndias - 27,$ano)); // lunes de carnaval
			$this->_festivoscalculados[] = date('d-m-Y',mktime(1,1,1,3,$ndias - 26,$ano)); // martes de carnaval
		}
		
		function getUltimoDiaMes() { 
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			return date("t", mktime(1,1,1,$mes,1,$ano));
		}
		
		function getDiaOrdinal( $prefijo, $diasem ) {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$ultimodia = $this->getUltimoDiaMes();
			$misem = array();			
			$ultimo = array();
			for($i=0; $i<7; $i++) { $misem[$i]=0; $ultimo[$i]=0; };
			for($i=1; $i<=$ultimodia;  $i++) {
				$midia = intval(date("w", mktime(0,0,0,$mes,$i,$ano)));			
				$misem[$midia]++;
				if($misem[$diasem]==$prefijo && $prefijo<T_ULTIMO) return date("d-m-Y", mktime(0,0,0,$mes,$i,$ano));
				$ultimo[$midia]=$i;
			}			
			if($prefijo==T_ULTIMO) return date("d-m-Y", mktime(0,0,0,$mes,$ultimo[$diasem],$ano));
			return false;
		} 
		
		function esDiaOrdinal($prefijo,$diasem) {
			$diaord = $this->getDiaOrdinal($prefijo,$diasem);
			return ($diaord == $this->_mifecha);
		}
		
		function getPuentes() {
			$puentes = array();
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$festivos = explode(",",$this->_festivos);
			foreach($festivos as $df) {
				list($dia,$mes) = explode(".",$df);
				$diasem = date("w", mktime(0,0,0,$mes,$dia,$ano));	
				$mifecha = date('d-m-Y',mktime(1,1,1,$mes,$dia,$ano)); // martes de carnaval
				if(($diasem==5 || $diasem==1) && !in_array($mifecha,$this->_festivoscalculados)) $puentes[] = $mifecha; // lunes o viernes
			}			
			return $puentes;
		}
		
		function esDia($diasem) {   // if($fecha->esDia("martes")) then ...
			$diasem = strtolower($diasem);
			return ($diasem==$this->_misdias[$this->DiaSem()]);			
		}

		function getPuentesLargos() {
			$puentes = array();
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$festivos = explode(",",$this->_festivos);
			foreach($festivos as $df) {
				list($dia,$mes) = explode(".",$df);
				$diasem = date("w", mktime(0,0,0,$mes,$dia,$ano));	
				$mifecha = date('d-m-Y',mktime(1,1,1,$mes,$dia,$ano)); // martes de carnaval
				if($diasem==4 && !in_array($mifecha,$this->_festivoscalculados)) $puentes[] = $mifecha; // jueves
				if($diasem==2 && !in_array($mifecha,$this->_festivoscalculados)) $puentes[] = $mifecha; // martes
			}			
			return $puentes;
		}


		function getCarnavales() {
			return array($this->festivoscalculados[2],$this->festivoscalculados[3]);
		}
		
		function getSemanaSanta() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$ss = array();
			$ndias = easter_days($ano);
			for($i=0; $i<5; $i++) $ss[] = date('d-m-Y',mktime(1,1,1,3,$ndias + 15 + $i,$ano)); // lunes a viernes santo
			return $ss;	
		}
		
		function AgregarDias($ndias) { // suma o resta n dias a la fecha actual
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$this->_mifecha = date('d-m-Y',mktime(1,1,1,$mes,$dia+$ndias,$ano)); 	
		}
		
			
		function AgregarDiasHabiles($ndias) {  // suma o resta N dias habiles
			if($ndias==0 || empty($ndias)) return false;			
			$incremento = $ndias/abs($ndias);
			for($i=0; $i<abs($ndias); $i++) {
				list($dia,$mes,$ano) = explode("-",$this->_mifecha);
				$this->_mifecha = date('d-m-Y',mktime(1,1,1,$mes,$dia+$incremento,$ano)); 	
				while($this->esFeriado()) $this->AgregarDias($incremento);
			}
		}
		
		function AgregarDiasLaborables($ndias) { // suma o resta N dias a la fecha, pero sin caer sabado ni domingo o feriado
			if($ndias==0 || empty($ndias)) return false;			
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$this->_mifecha = date('d-m-Y',mktime(1,1,1,$mes,$dia+$ndias,$ano)); 	
			$incremento = $ndias/abs($ndias);
			while($this->esFeriado()) $this->AgregarDias($incremento);
		}
		
		
		function getDiaSem() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);			
			return date("w", mktime(0,0,0,$mes,$dia,$ano));			
		}
		
		function getDiaMes() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);			
			return intval($dia);			
		}

		function getAno() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);			
			return intval($ano);			
		}
		
		function getDia() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			return intval($dia);
		}
		
		function getMes() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			return intval($mes);
		}
		
		
		function esFinDeSemana ()  {
			return ($this->getDiaSem()==0 || $this->getDiaSem()==6);
		}
		
		function esFeriado() {
			if($this->getDiaSem()==0 || $this->getDiaSem()==6) return true; // si es sabado o domingo
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$dia = intval($dia);
			$mes = intval($mes);
			$ano = intval($ano);
			$festivos = explode(",",$this->_festivos);
			foreach($festivos as $df) {
				list($diafest,$mesfest) = explode(".",$df);
				if($diafest==$dia && $mesfest==$mes) return true;
			}	
			if(in_array($this->_mifecha,$this->_festivoscalculados)) return true;
			return false;
		}
		
		function get() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			return date('d-m-Y',mktime(1,1,1,$mes,$dia,$ano)); 				
		}
		
		function getMysql() {
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			return "$ano-$mes-$dia";
		}
		
		function getFecha() {			
			list($dia,$mes,$ano) = explode("-",$this->_mifecha);
			$dia = intval($dia);
			$mes = intval($mes);
			return ucwords($this->_misdias[$this->getDiaSem()])." ".intval($dia)." de ".ucfirst($this->_mismeses[$mes-1])." de ".$ano;
		}
		
	}
	
?>